#include "sine_wave_generator_config.h"
#include "./sys_param/sys_param.h"
#include "./BSP/DAC/bsp_dac.h"
#include <stdio.h>

/**
 * @brief 初始化正弦波生成器
 * @retval 无
 */
void SineWave_Generator_Init(void)
{
    /* 生成正弦波缓冲区，使用当前配置的幅值和点数 */
    dac_creat_sin_buf(g_tSineWaveParam.amplitude, 100);
    
    /* 设置触发频率和采样点数，启动正弦波输出 */
    /* 计算参数：触发频率=频率*点数，ARR=72MHz/触发频率-1，PSC=1-1=0 */
    uint32_t trigger_freq = g_tSineWaveParam.frequency * 100;  /* 触发频率 = 输出频率 * 点数 */
    uint16_t arr = 72000000 / trigger_freq - 1;
    dac_dma_wave_init(1, (uint32_t)&DAC->DHR12R1, (uint32_t)g_dac_sin_buf);
    dac_dma_wave_enable(100, arr, 0);  /* 100个点，根据频率计算ARR值，PSC=0 */
    
    /* 输出初始化信息 */
    printf("Sine wave generator initialized with %dHz frequency, %d amplitude, %d phase\r\n", 
           g_tSineWaveParam.frequency, g_tSineWaveParam.amplitude, g_tSineWaveParam.phase);
}

/**
 * @brief 停止正弦波生成器
 * @retval 无
 */
void SineWave_Generator_DeInit(void)
{
    /* 停止DAC DMA输出 */
    HAL_DAC_Stop_DMA(&g_dac_dma_handle, DAC_CHANNEL_1);
    
    /* 输出反初始化信息 */
    printf("Sine wave generator stopped\r\n");
}

/**
 * @brief 更新正弦波频率
 * @param frequency: 频率值（1-30000Hz）
 * @retval 无
 */
void SineWave_Generator_UpdateFrequency(uint16_t frequency)
{
    /* 限制频率范围 */
    if (frequency < 1) frequency = 1;
    if (frequency > 30000) frequency = 30000;
    
    /* 更新参数系统中的频率值 */
    g_tSineWaveParam.frequency = frequency;
    
    /* 计算新的触发频率和ARR值 */
    uint32_t trigger_freq = frequency * 100;  /* 触发频率 = 输出频率 * 点数 */
    uint16_t arr = 72000000 / trigger_freq - 1;
    
    /* 更新DAC DMA输出参数 */
    HAL_DAC_Stop_DMA(&g_dac_dma_handle, DAC_CHANNEL_1);
    dac_dma_wave_enable(100, arr, 0);  /* 100个点，根据频率计算ARR值，PSC=0 */
    
    printf("Sine wave frequency updated to %dHz\r\n", frequency);
}

/**
 * @brief 更新正弦波幅值
 * @param amplitude: 幅值（100-2048）
 * @retval 无
 */
void SineWave_Generator_UpdateAmplitude(uint16_t amplitude)
{
    /* 限制幅值范围 */
    if (amplitude < 100) amplitude = 100;
    if (amplitude > 2048) amplitude = 2048;
    
    /* 更新参数系统中的幅值 */
    g_tSineWaveParam.amplitude = amplitude;
    
    /* 重新生成正弦波缓冲区并更新DAC DMA输出 */
    HAL_DAC_Stop_DMA(&g_dac_dma_handle, DAC_CHANNEL_1);
    
    dac_creat_sin_buf(amplitude, 100);
    
    /* 重新计算ARR值并启动DAC DMA */
    uint32_t trigger_freq = g_tSineWaveParam.frequency * 100;
    uint16_t arr = 72000000 / trigger_freq - 1;
    dac_dma_wave_enable(100, arr, 0);
    
    printf("Sine wave amplitude updated to %d\r\n", amplitude);
}

/**
 * @brief 更新正弦波相位
 * @param phase: 相位（0-360度）
 * @retval 无
 * @note 当前实现暂不支持相位调节，预留接口
 */
void SineWave_Generator_UpdatePhase(uint16_t phase)
{
    /* 限制相位范围 */
    if (phase > 360) phase = 360;
    
    /* 更新参数系统中的相位值 */
    g_tSineWaveParam.phase = phase;
    
    /* 当前实现简单输出相位信息，不实际调整相位
     * 注意：要实现相位调整需要重新设计DAC DMA配置
     */
    printf("Sine wave phase updated to %d degrees (Note: phase adjustment not implemented)\r\n", phase);
}

/**
 * @brief 保存正弦波生成器配置到EEPROM
 * @retval 无
 */
void SineWave_Generator_SaveConfig(void)
{
    /* 保存参数到EEPROM */
    SaveSingleParamByAddr(&g_tSineWaveParam.frequency);
    SaveSingleParamByAddr(&g_tSineWaveParam.amplitude);
    SaveSingleParamByAddr(&g_tSineWaveParam.phase);
}

/**
 * @brief 从EEPROM加载正弦波生成器配置
 * @retval 无
 */
void SineWave_Generator_LoadConfig(void)
{
    /* 从EEPROM加载参数 */
    LoadSingleParamByAddr(&g_tSineWaveParam.frequency);
    LoadSingleParamByAddr(&g_tSineWaveParam.amplitude);
    LoadSingleParamByAddr(&g_tSineWaveParam.phase);
} 
